package com.paradogs.framework.core.annoations.rpc;

import org.springframework.beans.factory.FactoryBean;
import org.springframework.cglib.proxy.Enhancer;

/**
 * @author: yumi
 * @date: 2023/8/13  9:37
 * @Description: TODO
 */
public class PRRPCProxyBean<T> implements FactoryBean<T> {

    /**
     * 被代理的接口
     */
    private Class<T> myInterfaceClass;

    /**
     * 构造函数
     * @param myInterfaceClass 被代理的接口类型，该参数，由注解解析器自动赋值
     */
    public PRRPCProxyBean(Class<T> myInterfaceClass) {
        this.myInterfaceClass = myInterfaceClass;
    }

    /**
     * 返回该bean是否为单例类型
     * @return
     */
    @Override
    public boolean isSingleton() {
        return FactoryBean.super.isSingleton();
    }

    /**
     * 当 ioc 容器提取对象时，调用此方法获取一个代理对象
     * @return
     * @throws Exception
     */
    @Override
    public T getObject() throws Exception {

        //用于创建代理对象的增强器，可以对目标对象进行扩展
        Enhancer enhancer = new Enhancer();
        //将目标对象设置为父类
        enhancer.setSuperclass(myInterfaceClass);
        //设置目标拦截器
        enhancer.setCallback(new PRRPCProxyInterceptor());
        // 创建代理对象
        return (T)enhancer.create();

    }

    /**
     * 当 ioc 容器获取类型时，从此方法获取类型
     * @return
     */
    @Override
    public Class<T> getObjectType() {
        return myInterfaceClass;
    }

}
